CloudFormation で EC2 のセキュリティグループの変更を実施した際に EC2 の置き換えが発生する場合の対処方法
困っていた内容
CloudFormation で以下のテンプレートを使用して EC2 インスタンスを作成しました。
AWSTemplateFormatVersion: "2010-09-09" Resources: Test20220121Server: Type: AWS::EC2::Instance Properties: ImageId: "ami-066333d9c572b0680" InstanceType: t2.micro NetworkInterfaces: - DeviceIndex: "0" SubnetId: subnet-21a***** GroupSet: - sg-6a9***** - sg-075**************
その後、NetworkInterfaces プロパティ内の GroupSet にセキュリティグループを追加/削除してスタックのアップデートを実施したところ、 EC2 インスタンスの置き換え(新規インスタンスが作成され、既存インスタンスが削除される)が発生してしまいました。
EC2 インスタンスの置き換えを発生させずにセキュリティグループを追加/削除する方法はありますか。
どう対応すればいいの?
対応方法は2通りあります。
① セキュリティグループの追加/削除を行わずに、既存のセキュリティグループのルールを変更して対応する
運用的に問題がなく、変更が必要となるルールの数が少なければ、こちらの対応が楽かと思います。
② AWS::EC2::NetworkInterface と AWS::EC2::Instance を組み合わせてリソース作成をおこなう
AWS::EC2::NetworkInterface の GroupSet プロパティは変更を加えてもリソースの置換が発生しません。
GroupSet
The security group IDs associated with this network interface.
(省略)
Update requires: No interruption
そのため、以下のように AWS::EC2::NetworkInterface と AWS::EC2::Instance で分けてテンプレートを構成すると、後にセキュリティグループの変更が必要になった際に EC2 インスタンスの置き換えを避けることができます。
AWSTemplateFormatVersion: "2010-09-09" Resources: TestNetWorkInterface: Type: AWS::EC2::NetworkInterface Properties: SubnetId: subnet-21a***** GroupSet: - sg-6a9***** - sg-075************** Test20220121Server: Type: AWS::EC2::Instance Properties: ImageId: "ami-066333d9c572b0680" InstanceType: t2.micro NetworkInterfaces: - DeviceIndex: '0' NetworkInterfaceId: !Ref TestNetWorkInterface
なぜ EC2 インスタンスの置き換えが発生するの?
AWS::EC2::Instance の NetworkInterface プロパティ を変更すると、リソースの置換が発生します。
NetworkInterfaces
The network interfaces to associate with the instance.
(省略)
Update requires: Replacement
それにより、AWS::EC2::Instance の NetworkInterface プロパティのサブプロパティである GroupSet を変更した場合も NetworkInterface プロパティの変更と見なされ、リソースの置換が発生します。
おわりに
AWS::EC2::Instance NetworkInterface のドキュメント では、GroupSet の更新は「No interruption」との記載があるため、EC2 インスタンスの置き換えは発生しない認識でしたが、実際にスタックを作成してみて勉強になりました。